<?php

//通过类 实例化 得到对象
// 类：封装 继承 多态(属性和方法)
// 属性和方法(权限): 公共 受保护的 私有的
// 魔术方法 构造函数(__construct) 在创建的时候被调用 析构函数(__destruct) 在销毁的时候被调用
//内部对象：
    // 用来表示自己的 $this self(用于调用静态类和常量)
    // 用来表示父类的 parent
class DB{
    //属性
    //公共：内部 和 外部 都能访问
    public $host;
    public $username;
    public $password;

    // 受保护的 内部(父和子)可以访问  (父和子)外部不能访问
    protected $dbname;

    //私有的 内部(父)可以访问 (父和子)外部不能访问
    private $link;
    
    // 构造函数
    public function __construct($host, $username, $password, $dbname)
    {
        //赋值了
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->dbname = $dbname;

        // echo $this->dbname;
        $this->link = mysqli_connect($this->host, $this->username, $this->password, $this->dbname);

        // var_dump($this->link); 
    }

    public function select()
    {
        return '查询方法';
    }
}

// 子类
class Mysql extends DB{

    static $demo = '静态属性';

    const PI = 3.1415926; //常量


    //重新定义一遍(覆盖) 在类被实例化的时候自动调用
    public function __construct($host, $username, $password, $dbname)
    {
        //保留父类的构造函数
        // parent::__construct() == DB::__construct();
        parent::__construct($host, $username, $password, $dbname);

        // echo '子类构造函数';

        // var_dump($this->dbname); //受保护可以被子类拿过来
        // var_dump($this->link); //undefined 因为私有属性不会继承
    }

    //析构函数 在对象即将被调用完成后(销毁前) 自动执行的一个方法
    public function __destruct()
    {
        echo '析构函数';
    }

    //静态方法
    static function work()
    {
        //在内部调用常量
        var_dump(self::PI);

        return '静态方法';
    }
}

// 实例化  构造函数：当类实例化的时候 自动被调用函数
// new DB == __construct()
$db = new Mysql("localhost", "root", "root", "company");

// var_dump($db->host);
// echo "<br />";
// var_dump($db->username);
// echo "<br />";
// echo $db->dbname; //访问不了 因为是protected
// echo $db->link; //访问不了 因为是private
//调用方法
// var_dump($db->select());

// 静态方法和静态属性：我们可以不需要实例化类就可以访问的
var_dump(Mysql::$demo);
var_dump(Mysql::work());

//常量和静态的调用方式是一样的
var_dump(Mysql::PI);


//SELECT * FROM pre_person WHERE 1 ORDER BY LIMIT

?>